import { Mouse} from "./behavior/Mouse";
import { PanMouse } from "./handler/PanMouse";
import { PanKeyBoard } from "./handler/PanKeyBoard";
import {PanTouce} from "./handler/PanTouce";
import { ZoomMouse } from "./handler/ZoomMouse";
import { ZoomTouch } from "./handler/ZoomTouch";
import { ZoomKeyBoard } from "./handler/ZoomKeyBoard";
import { RotateMouse } from "./handler/RotateMouse";
import { RotateTouch } from "./handler/RotateTouch";
import { RotateKeyBoard } from "./handler/RotateKeyBoard";
import { Component, ComponentType } from "../Component";
import { Register } from "../../register/Register";
import { Animation } from "../animation/Animation";
import { any } from "../../core/logic";
/**
 * 轨道控制器类
 * @class
 * @memberof w.control
 */
class Orbit extends Component{
    /**
     * 创建轨道控制器
     * @param {w.component.Camera} opts.target 【必选】控制器的相机对象。
     * @param {string} opts.mode 【可选值,缺省:"map"】 轨道控制的交互模式，"3d"|"map",3d模式:左键旋转右键平移 map地图模式:左键平移，右键旋转。。
     * @param {Array} opts.restrict 【可选值】 平移操作的范围约束，缺省:undifine，[minX,minY,maxX,maxY]。
     * @param {string} opts.easing 【可选值】 轨道控制时缓动方式，缺省值："easeOut_Cubic"。
     * @param {number} opts.dual 【可选值】 轨道控制时缓动时长，缺省值：0.5秒。
     * @param {number} opts.speed 【可选值】轨道控制缓动速度，缺省值：0.2。
     * @param {number} opts.ratio 【可选值】一次缩放的缩放比例，其值必须大于1，缺省值：1.5，其值越小，缩放越细，反之越粗。
     * @param {number} opts.maxPitch 【可选值】最大倾斜角，缺省值：Math.PI/3。
     * @param {String} opts.zoomMode 【可选值】缩放模式，缺省值:"points"。可选值：points(锚定鼠标点缩放)|center(锚定场景中心点缩放)。
     * @param {Number} opts.maxDistance 【可选值】相机的最远距离，再缩放时，相机视距不能超过该阈值，缺省值：Number.MAX_VALUE。
     * @param {Number} opts.minDistance 可选值】相机的最近距离，再缩放时，相机视距不低于该阈值，缺省值：0。
     */
    constructor(opts={}){
        opts.type=ComponentType.Orbit;
        super(opts);
        this.mouseBehavior=new Mouse(opts);
        //pan
        this.mousePan=new PanMouse(opts);
        this.touchPan=new PanTouce(opts);
        this.keyboardPan=new PanKeyBoard(opts);
        //zoom
        this.mouseZoom=new ZoomMouse(opts);
        this.touchZoom=new ZoomTouch(opts);
        this.keyboardZoom=new ZoomKeyBoard(opts);
        //rotate
        this.mouseRotate=new RotateMouse(opts);
        this.touchRotate=new RotateTouch(opts);
        this.keyboardRotate=new RotateKeyBoard(opts);
        this.mode=any(opts.mode,"map");
        let animation=new Animation({name:"OrbitAnimation"});
        Register.instance.manager(ComponentType.Animation).add(animation)
        this.mousePan.animation=this.touchPan.animation=this.keyboardPan.animation=this.mouseZoom.animation=this.touchZoom.animation=this.keyboardZoom.animation=this.mouseRotate.animation=this.touchRotate.animation=this.keyboardRotate.animation=animation;
        this.active();
    }
    /**
     * @property {Number} 最大倾斜角度
     */
    set maxPitch(v){
        this.mouseRotate.maxPitch=v;
        return this;
    }
    get maxPitch(){
        return this.mouseRotate.maxPitch;
    }
    set maxDistance(v){
        this.mouseZoom.maxDistance=v;
        return this;
    }
    get maxDistance(){
        return this.mouseZoom.maxDistance;
    }
    set minDistance(v){
        this.mouseZoom.minDistance=v;
        return this;
    }
    get minDistance(){
        return this.mouseZoom.minDistance;
    }
    set restrict(v){
        this.mousePan.restrict=v;
        return this;
    }
    get restrict(){
        return this.mousePan.restrict;
    }
    set zoomMode(v){
        this.mouseZoom.zoomMode=v;
        return this;
    }
    get zoomMode(){
        return this.mouseZoom.zoomMode;
    }
    /**
     * 轨道控制器的交互模式"3d"|"map",3d模式:左键旋转右键平移 map地图模式:左键平移，右键旋转。
     * @property {String}
     */
    set mode(v){
        this._mode=v;
        if(v=="3d"){
            this.mousePan.button=2;//改为右键移动。
            this.mouseRotate.button=0;//改为左键旋转。
        }else{
            this.mousePan.button=0;//改为右键移动。
            this.mouseRotate.button=2;//改为左键旋转。
        }
    }
    get mode(){
        return this._mode;
    }
    // /**
    //  * @property {Number} 最大倾斜角度
    //  */
    // set panButton(v){
    //     this.mousePan.button=v;
    //     return this;
    // }
    // get panButton(){
    //     return this.mouseRotate.maxPitch;
    // }
    /**
     * 轨道控制器激活。
     * @method
     */
    active(){
        this.mouseBehavior.active();
        this.activePan();
        this.activeZoom();
        this.activeRotate();
    }
    /**
     * 轨道控制器禁用。
     * @method
     */
    deactive(){
        this.mouseBehavior.deactive();
        this.deactivePan();
        this.deactiveZoom();
        this.deactiveRotate();
    }
    /**
     * 轨道控制器平移功能激活。
     * @method
     */
    activePan(){
        this.mousePan.active();
        this.touchPan.active();
        this.keyboardPan.active();
    }
    /**
     * 轨道控制器缩放功能激活。
     * @method
     */
    activeZoom(){
        this.mouseZoom.active();
        this.touchZoom.active();
        this.keyboardZoom.active();
    }
    /**
     * 轨道控制器缩放功能激活。
     * @method
     */
    activeRotate(){
        this.mouseRotate.active();
        this.touchRotate.active();
        this.keyboardRotate.active();
    }
    /**
     * 轨道控制器平移功能禁用。
     * @method
     */
    deactivePan(){
        this.mousePan.deactive();
        this.touchPan.deactive();
        this.keyboardPan.deactive(); 
    }
    /**
     * 轨道控制器缩放功能禁用。
     * @method
     */
    deactiveZoom(){
        this.mouseZoom.deactive();
        this.touchZoom.deactive();
        this.keyboardZoom.deactive();
    }
    /**
     * 轨道控制器旋转功能禁用。
     * @method
     */
    deactiveRotate(){
        this.mouseRotate.deactive();
        this.touchRotate.deactive();
        this.keyboardRotate.deactive();
    }
    stopAnimation(){
        this.mousePan.animation.stop();
        this.mouseRotate.animation.stop();
        this.mouseZoom.animation.stop();
    }
}
export {Orbit}